﻿//=============================================================================
// Библиотека 'WPFExcelReport' предназначена для связи и передачи данных c PLC
//=============================================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

// Структуры PLC S7
namespace WPFExcelReport.S7
{
    /// <summary>
    /// Data block
    /// </summary>
    internal class DB
    {
        #region Свойства

        /// <summary>
        /// Номер DB
        /// </summary>
        public int Num = 0;

        /// <summary>
        /// Границы чтения/записи: идут друг за другом
        /// </summary>
        public List<int> Bounds = new List<int>(10);

        /// <summary>
        /// Список используемых байт (СИБ)
        /// </summary>
        public List<int> Bytes = new List<int>(100);

        /// <summary>
        /// Дискр-ры адресов переменных, в качестве строка адреса перем-й
        /// </summary>   
        public List <string> Handls = new List<string>(100);
       
        #endregion

        #region Конструктор

        /// <summary>
        /// Конструктор объекта Data block
        /// </summary>
        /// <param name="num"> номер DB</param>
        public DB(int num)
        {
            this.Num = num;
        }

        #endregion

    }

    /// <summary>
    /// Меркерная область
    /// </summary>
    internal class M
    {
        #region Свойства
                
        /// <summary>
        /// Границы чтения/записи: идут друг за другом
        /// </summary>
        public List<int> Bounds = new List<int>(10);

        /// <summary>
        /// Список используемых байт (СИБ)
        /// </summary>
        public List<int> Bytes = new List<int>(100);

        /// <summary>
        /// Дискр-ры адресов переменных, в качестве строка адреса перем-й
        /// </summary>   
        public List<string> Handls = new List<string>(100);

        #endregion

        #region Конструктор

        /// <summary>
        /// Конструктор объекта M
        /// </summary>
        public M()
        {
            
        }

        #endregion

    }
        
    /// <summary>
    /// Адрес переменной
    /// </summary>
    internal class Addr
    {
        #region Свойства

        /// <summary>
        /// Номер DB
        /// </summary>
        public int DbNum = 0;
                
        /// <summary>
        /// Тип значения переменной
        /// </summary>
        public ValType ValType = ValType.ByteT;

        /// <summary>
        /// Область перем
        /// </summary>
        public ValArea ValArea = ValArea.DB;
        
        /// <summary>
        /// Старт байт
        /// </summary>
        public int StartByte = 0;

        /// <summary>
        /// Длина, байт
        /// </summary>
        public int Length = 0;


        #endregion

        #region Конструктор

        /// <summary>
        /// Конструктор объекта Addr
        /// </summary>
        /// <param name="dbNum"> номер DB</param>
        /// <param name="valType"> тип значение переменной</param>
        /// <param name="vArea"> область перем</param>
        /// <param name="stByte"> старт байт</param>
        /// <param name="leng"> длина, байт</param>
        public Addr(int dbNum, ValType valType, ValArea vArea, int stByte, int leng)
        {
            this.DbNum = dbNum;
            this.ValType = valType;
            this.ValArea = vArea;
            this.StartByte = stByte;
            this.Length = leng;
        }

        #endregion
    }

    /// <summary>
    /// Описание plc
    /// </summary>
    internal class PlcDesc
    {
        #region Свойства

        /// <summary>
        /// ip адрес
        /// </summary>
        public string IP = "";

         /// <summary>
        /// Стойка
        /// </summary>
        public int Rack = 0;

        /// <summary>
        /// Слот
        /// </summary>
        public int Slot = 3;

        /// <summary>
        /// Тип CPU
        /// </summary>
        public CpuType Cpu = CpuType.S7300;

        /// <summary>
        /// Имя PLC
        /// </summary>
        public string Name = "plc1";

        /// <summary>
        /// Время обновления данных, мс
        /// </summary>
        public int TimeUpd
        {
            get { return _timeUpd; }

            set
            {
                if (value < 100) value = 100;
                _timeUpd = value;
            }
        }
                
        #endregion

        #region Поля
        
        /// <summary>
        /// Период обновления сигналов
        /// </summary>
        private int _timeUpd = 100;

        #endregion

        #region Конструктор

        /// <summary>
        /// Конструктор объекта PlcDescript
        /// </summary>
        public PlcDesc()
        {
            
        }

        #endregion
    }

    /// <summary>
    /// Тип значения переменной
    /// </summary>
    internal enum ValType
    {
        /// <summary>
        /// byte
        /// </summary>
        ByteT = 1,

        /// <summary>
        /// int
        /// </summary>
        IntT = 2,

        /// <summary>
        /// dint
        /// </summary>
        DIntT = 3,

        /// <summary>
        /// real
        /// </summary>
        RealT = 4,

        /// <summary>
        /// string
        /// </summary>
        StringT = 5,
    }

    /// <summary>
    /// Тип операции
    /// </summary>
    internal enum OperationType
    {
        /// <summary>
        /// Добавление переменной
        /// </summary>
        Add = 1,

        /// <summary>
        /// Удаление переменной
        /// </summary>
        Del = 2,
    }

    /// <summary>
    /// Тип перем - чтение/запись
    /// </summary>
    internal enum ValRW
    {
        /// <summary>
        /// Для чтения
        /// </summary>
        Read = 1,

        /// <summary>
        /// Для записи
        /// </summary>
        Write = 2,
    }

    /// <summary>
    /// Тип перем - db/m
    /// </summary>
    internal enum ValArea
    {
        /// <summary>
        /// DB
        /// </summary>
        DB = 1,

        /// <summary>
        /// Меркер
        /// </summary>
        M = 2,
    }

    /// <summary>
    /// Код ошибки
    /// </summary>
    internal enum ErrCode
    {
        /// <summary>
        /// ок
        /// </summary>
        Ok = 0,

        /// <summary>
        /// Такой адрес уже существует
        /// </summary>
        AddrExist = 1,

        /// <summary>
        /// Такой адрес не существует
        /// </summary>
        AddrNoExist = 2,

        /// <summary>
        /// Ошибка адреса
        /// </summary>
        AddrFlt = 3,

        /// <summary>
        /// Ошибка передачи данных. Проверьте адрес и параметры контроллера.
        /// </summary>
        ConnFlt = 4,

        /// <summary>
        /// Нет пинга. Проверьте адрес контроллера и наличие сети. 
        /// </summary>
        PingNo = 5,

        /// <summary>
        /// Ошибка доступа к данным для чтения. Проверьте существуют ли данные.
        /// </summary>
        DataReadFlt = 6,

        /// <summary>
        /// Ошибка доступа к данным для записи. Проверьте существуют ли данные.
        /// </summary>
        DataWriteFlt = 7,
               
    }

    /// <summary>
    /// Тип CPU
    /// </summary>
    internal enum CpuType
    {
        S7400 = 1,
        S7300 = 2,
        S7200 = 3,
        S71200 = 4,
    }
}
